package com.hnzq.cloud.service.impl;


import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hnzq.cloud.commons.TransferBeanUtil;
import com.hnzq.cloud.dto.FreGoodsDto;
import com.hnzq.cloud.entity.FreGoods;
import com.hnzq.cloud.exception.FreGoodsException;
import com.hnzq.cloud.mapper.FreGoodsMapper;
import com.hnzq.cloud.model.Result;
import com.hnzq.cloud.param.AddFreGoodsInfoParam;
import com.hnzq.cloud.param.UpdateFreGoodsInfoParam;
import com.hnzq.cloud.param.UpdateStockParam;
import com.hnzq.cloud.repo.FreGoodsRepo;
import com.hnzq.cloud.service.FreGoodsService;
import org.springframework.beans.BeanUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author jams
 * @since 2022-02-06
 */
@Service
public class FreGoodsServiceImpl extends ServiceImpl<FreGoodsMapper, FreGoods> implements FreGoodsService {

    @Resource
    private FreGoodsRepo freGoodsRepo;

    @Override
    public Boolean addFreGoods(AddFreGoodsInfoParam addFreGoodsInfoParam) {
        FreGoods freGoods = TransferBeanUtil.copyObject(addFreGoodsInfoParam, FreGoods.class);
        if (freGoods.getGoodsAddr()==null) throw new FreGoodsException("商品产地信息为空",101);
        if (freGoods.getGoodsBirthtime()==null) throw new FreGoodsException("商品生产日期未填写",101);
        if (freGoods.getGoodsDescimg()==null) throw new FreGoodsException("商品的描述图片为空",101);
        if (freGoods.getGoodsDiscount()==null) throw new FreGoodsException("商品折扣未填写",101);
        if (freGoods.getGoodsFreshtime()==null) throw new FreGoodsException("商品的保质期未填写",101);
        if (freGoods.getGoodsMessage()==null) throw new FreGoodsException("商品描述为空",101);
        if (freGoods.getGoodsName()==null) throw new FreGoodsException("商品名称为空",101);
        if (freGoods.getGoodsPrice()==null) throw new FreGoodsException("商品预售价为空",101);
        if (freGoods.getGoodsStock()==null) throw new FreGoodsException("商品库存未填写",101);
        if (freGoods.getTypeName()==null) throw new FreGoodsException("未选择商品对应的类型",101);
        if (freGoods.getWarehouseId()==null) throw new FreGoodsException("未选择商品所在仓库ID",101);
        if (freGoods.getBalanceconfPercent()==null) throw new FreGoodsException("对应商品的佣金返点未设置",101);
        freGoods.setGoodsStatus(0);//商品上下架状态，默认设置为0——未上架，1——已上架

        //判断有无相同的商品名
        List<FreGoods> freGoodsList = freGoodsRepo.selectGoodsByName(freGoods.getGoodsName());
        Boolean flag=true;
        if (freGoodsList.size()<1){
            return saveOrUpdate(freGoods);
        }else {
            for (FreGoods goods : freGoodsList) {
                if (goods.getGoodsName().equals(freGoods.getGoodsName())){
                    flag=false;
                    break;
                }
            }
            if (!flag){
                throw new FreGoodsException("已存在该商品，请重新确认信息",104);
            }else {
                return saveOrUpdate(freGoods);
            }
        }
    }

    @Override
    public Boolean putOnFreGoods(Integer freGoodsId) {
        FreGoods freGoods = getById(freGoodsId);
        if (freGoods==null) throw new FreGoodsException("该商品不存在",114);
        if (freGoods.getIsDelete()==1) throw new FreGoodsException("该商品已被删除，不能进行此操作",144);
        if (freGoods.getGoodsStatus()==1){
            throw new FreGoodsException("该商品已上架，请勿重复操作",103);
        }else {
            freGoods.setGoodsStatus(1);
            return saveOrUpdate(freGoods);
        }
    }

    @Override
    public Boolean offFreGoods(Integer freGoodsId) {
        FreGoods freGoods = getById(freGoodsId);
        if (freGoods==null) throw new FreGoodsException("该商品不存在",114);
        if (freGoods.getIsDelete()==1) throw new FreGoodsException("该商品已被删除，不能进行此操作",144);
        if (freGoods.getGoodsStatus()==0){
            throw new FreGoodsException("该商品还未上架，请勿重复下架操作",103);
        }else {
            freGoods.setGoodsStatus(0);
            return saveOrUpdate(freGoods);
        }
    }

    @Override
    public Boolean changeFreGoodsInfo(UpdateFreGoodsInfoParam updateFreGoodsInfoParam) {
        FreGoods freGoods = getById(updateFreGoodsInfoParam.getGoodsId());
        if (freGoods==null) throw new FreGoodsException("该商品不存在",114);
        if (freGoods.getIsDelete()==1) throw new FreGoodsException("该商品已被删除，不能进行此操作",144);
        BeanUtils.copyProperties(updateFreGoodsInfoParam,freGoods);
        return saveOrUpdate(freGoods);
    }

    @Override
    public Boolean deleteFreGoods(List<Integer> ids){
        List<FreGoods> freGoodsList = this.baseMapper.selectBatchIds(ids);
        if (freGoodsList.size()!=ids.size()) throw new FreGoodsException("有商品不存在",114);
        for (FreGoods freGoods : freGoodsList) {
            if (freGoods.getIsDelete()==1) throw new FreGoodsException("存在已被删除的商品，不能进行此操作",144);
            freGoods.setIsDelete(1);
        }
        return saveOrUpdateBatch(freGoodsList);
    }

    @Override
    public Boolean updateFreGoodsStock(List<UpdateStockParam> updateStockParams){
        HashMap<Integer, Integer> map = new HashMap<>();
        for (UpdateStockParam updateStockParam : updateStockParams){
            map.put(updateStockParam.getGoodsId(),updateStockParam.getNumber());
        }
        List<Integer> goodsIds = updateStockParams.stream().map(item -> item.getGoodsId()).collect(Collectors.toList());
        List<FreGoods> freGoodsList = this.baseMapper.selectBatchIds(goodsIds);
        if (freGoodsList.size()!=goodsIds.size()) throw new FreGoodsException("有商品不存在",114);
        for (FreGoods freGoods : freGoodsList) {
            Integer num = map.get(freGoods.getGoodsId());
            if (num>freGoods.getGoodsStock()) throw new FreGoodsException("商品库存不足",147);
            freGoods.setGoodsStock(freGoods.getGoodsStock()-num);
        }
        System.out.println(freGoodsList);
        return saveOrUpdateBatch(freGoodsList);
    }

    @Override
    public Page<FreGoods> findAll(){
        Page<FreGoods> freGoods = freGoodsRepo.findAll(PageRequest.of(0, 10));
        return freGoods;
    }

    @Override
    public Page<FreGoods> selectGoodsByKeyword(String keyword){
        Page<FreGoods> freGoods = freGoodsRepo.selectGoodsByKeyword(keyword, PageRequest.of(0, 10));
        return freGoods;
    }

    @Override
    public Map<Integer, FreGoodsDto> findGoodsInfos(List<Integer> ids){
        List<FreGoods> freGoods = this.baseMapper.selectBatchIds(ids);
        if (freGoods==null) throw new FreGoodsException("商品不存在",144);
        if (freGoods.size()!=ids.size()){
            throw new FreGoodsException("有商品不存在",144);
        }
        List<FreGoodsDto> goodsList = TransferBeanUtil.copyList(freGoods, FreGoodsDto.class);
        Map<Integer, FreGoodsDto> map = new HashMap<>();
        for (FreGoodsDto freGoodsDto : goodsList) {
            map.put(freGoodsDto.getGoodsId(),freGoodsDto);
        }
        return map;
    }

    @Override
    public FreGoodsDto findFreGoodsInfo(Integer id) {
        FreGoods freGoods = getById(id);
        if (freGoods==null) throw new FreGoodsException("商品不存在",144);
        FreGoodsDto goodsDto = TransferBeanUtil.copyObject(freGoods, FreGoodsDto.class);
        return goodsDto;
    }

}
